Servlet技术(二) --请求和响应
开头提要
这一个章节中更重要的是HttpServletRequest对象的相关方法
主要技术概括如下:
- 网页的定时刷新和跳转
 - 利用referer放盗链
 - 获取请求参数以及通过request对象传递数据
 - 请求重定向(数据会被丢失)
 - 请求转发 (数据不会被丢失)
 - 请求包含 (返回的包括主题servlet和包含的servlet两部分内容)
在编写这方面的程序的时候经常会遇到乱码问题,详情请看字符乱码问题的解决办法HttpServletResponse对象
发送状态码相关的方法
 - setStatus(int status)方法
 - sendError(int sc)方法
public void sendError(int code) throws java.io.IOException
public void sendError(int code, String message) throws java.io.IOException 
相应的状态代码参数的描述如下:
发送响应消息头相关的方法

发送响应消息体的相关方法
- getOutputStream()方法 用于输出二进制格式的响应正文
 - getWriter()方法 用于输出内容全为字符文本的网页文档
在此不进行过多的赘述和相关代码的实验了,需要注意的是:
getOutputStream()和getWriter()方法都可以发送响应消息体,但是它们之间互相排斥,不可以同时使用,否则会发生IllegalStateException异常 
网页定时刷新并跳转
HTTP协议中,定义了一个Refresh头字段,它可以通知浏览器在指定的时间内自动刷新并跳转到其他页面
    response.setHeader(“Refresh”,”2,URL=http:xxxxxxxxx” 表示的是浏览器在2秒之后自动跳转到xxxxxxxxx的网站
    response.setHeader(“Refresh”,”3”) 表示每隔3秒页面定时刷新
禁止浏览器缓存页面
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
请求重定向(重要)
工作原理如下:
方法如下:
    public void sendRedirect(java.lang.String location) throws java.io.IOException
在请求重定向的过程中,传输的信息会丢失
HttpServletRequest对象
获取请求行信息的相关方法
在这一小节里面主要是HTTP头字段的相关操作,所以掌握HTTP头字段和HTTP协议是十分有必要的,详情请看关于HTTP协议
- 当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名,请求路径等信息,为了获取这些信息,在HttpServletRequest接口中,定义了一系列用于获取请求行信息的方法,如下表所示


如上表所示,相关方法的效果已经表述的很详近了,在此不进行代码实验了 - 当请求Servlet时,需要通过请求头向服务器传递附加信息,例如,客户端可以接受的数据类型,压缩方式,语言等等,具体方法如下表所示


 
利用referer请求头防止”盗链”
实现思路如下
- 获取referer头字段的值
 - 获取网站的域名
 - 判断:如果referer头字段的值不为空,并且网站的域名和referer头字段的值相等,就进行相应文件的下载什么的,否则就重定向到另外一个消息返回错误的网页上
 
主要的servlet代码如下
至于跳转到的网页代码,在此就不再贴出来了
获取请求参数

这些方法基本上是用来处理表单数据的,没什么太多需要注意的地方,暂时不贴代码了
获取网络连接信息


以上就不再添加代码了,根据实际情况进行代码的编写就可以了
通过request对象传递数据(重要)
| 方法 | 效果 | 
|---|---|
| setAttribute(String name, Object o) | 将一个对象与一个名称关联后存储进ServletRequest对象中 | 
| getAttribute(String name) | 从ServletRequest对象中返回指定名称的属性对象 | 
| removeAttribute(String name) | 从ServletRequest对象中删除指定名称的属性 | 
| getAttributeNames() | 返回一个包含ServletRequest对象中所有属性名的Enumeration对象 | 
RequestDispatcher接口
| 方法 | 效果 | 
|---|---|
| getRequestDispatcher(String path) | 用于返回封装了某个路径所指定资源的RequestDispatcher对象 | 
| getNamedDispatcher(String name) | 用于返回封装了某个Web资源的RequestDispatcher对象,传递给该方法的参数是在Web应用程序部署好的某个Web资源名称 | 
| forward(ServletRequest request,ServletResponse response) | 该方法用于将请求从一个Servlet传递给另外的一个Web资源 | 
| include(ServletRequest request,ServletResponse response) | 该方法用于将其它的资源作为当前响应内容包含进来 | 
接下来进行最重要的两个概念了:
请求转发
原理如下图所示
在请求转发的过程中传输的信息不会丢失。
请求包含
原理如下图所示